const arrayProto = Array.prototype
// 拿到数组的原型对象
const arrayMethods = Object.create(arrayProto)
// 通过Object.create,创建一个新的原型对象
// 这样做的目的是为了不污染array原来的原型对象

const methodsToPatch = ['push', 'pop', 'unshift', 'shift', 'splice', 'sort', 'reverse']
// array种，这7种方法是终会改变数组本身。

methodsToPatch.forEach(method => {
    // 拦截这7个方法，除了让这几个方法完成本身的任务
    // 还要将这些方法做响应式处理
    Object.defineProperty(arrayMethods, method, {
        value: function (...args) {
            const ret = arrayProto[method].apply(this, args)
            console.log('数组响应式')

            let inserted = []

            switch (method) {
                case 'push':
                case 'unshift':
                    inserted = args
                    break;
                case 'splice':
                    inserted = args.slice(2)
                    break;
            }
            inserted.length && this.__ob__.observeArray(inserted)
            this.__ob__.dep.notify()
            return ret
        },
        configurable: true,
        writable: true,
        enumerable: true
    })
})

// 覆盖数组原有的原型对象，替换为这7个方法

export default function protoArguments(arr) {
    arr.__proto__ = arrayMethods
}